大部分系统布娃娃系统为什么能实现物理模拟动画的效果?

您所在的位置:网站首页 unity animationrigging 大部分系统布娃娃系统为什么能实现物理模拟动画的效果?

大部分系统布娃娃系统为什么能实现物理模拟动画的效果?

#大部分系统布娃娃系统为什么能实现物理模拟动画的效果?| 来源: 网络整理| 查看: 265

大部分系统布娃娃系统为什么能实现物理模拟动画的效果? 大部分系统布娃娃系统为什么能实现物理模拟动画的效果? 2023-03-21

布娃娃系统

布娃娃系统,相信很多玩家在大部分游戏中都遇到过。 Ragdoll作为一个成熟流行的系统,广泛应用于各种游戏中,提供一定程度的物理模拟。

9c251724-1825-11ec-ae30-e2cbc22591db~1.gif

图为典型的Ragdoll应用场景。 敌人被打到空中后翻滚倒在地上。 整个过程非常自然流畅。 而且,在整个过程中,没有使用传统的“动画”,一切都是基于物理模拟效果。 因此,布娃娃系统也是“程序化动画”的重要手段。

模型和骨架模型

要理解布娃娃系统为什么能达到物理模拟动画的效果,首先需要简单了解一下传统3D游戏中动画的实现。 (已经理解的同学可以直接跳到下一部分)

作为最常遇到的美术资源,模型本身就是一个由一系列顶点(坐标)信息组成的数据集,所以显然,纯模型是纯静态的,我们可以在Unity->Gizoms中查看Selection Wire看线框图对于模型。 在Unity中可以看到Mesh Renderer系列组件,其中Mesh就是模型的网格。

图片.png

那么要让模型动起来,需要做的就是让模型的每个顶点按照一定的规律运动像素游戏素材,达到“动画”的效果,这也是经典的“顶点动画”原理。

但在现代游戏中,一个稍微复杂的模型往往有数以万计的顶点。 美术师手动设置每个顶点的运动显然是不现实的,也很难达到合理的效果。

所以人们认为,在现实中,人类是靠骨骼带动肌肉运动的。 我们很少直接控制身体某块肌肉的运动,更多的是带动骨骼。 只要骨骼按照一定的规律运动,附着在骨骼上的肌肉也会随之运动,骨骼动画的概念就应运而生了。

骨骼

“骨”其实是一个抽象的概念。 它指的是人体利用骨骼带动肌肉运动的规律,为模型创造了一个类似的、抽象的“骨架”,如图所示。

图片.png

图片显示了一个包含骨骼的模型。 这里使用AnimationRigging插件中的BoneRenderer来以可视化的形式显示骨骼(否则骨骼是一个抽象的概念,不对应一些可见的实体)。 可以看出,模型骨骼与人体骨骼非常相似,只是做了一定程度的简化。

实际上,Unity中的骨骼只是一系列具有父子层级关系的空对象。 等级结构在一定程度上指代了现实。 父骨骼可以带动子​​骨骼运动(比如我们抬起大腿时,小腿会跟着大腿运动),Unity的父子结构可以很好的表达这个特性。 连接父骨骼到子骨骼的连线,得到上图可视化的骨骼形状unity 道具模型,这样更容易表现出骨骼的形状。

图片.png

图中的骨架代表了层次结构的骨架,身体就是人物模型,再次说明了模型和骨架是分离的。

剥皮的

所谓蒙皮就是将模型的顶点附加到骨骼上的过程,即决定哪些“肌肉”由哪些“骨骼”控制。 建立这样的绑定关系后,当我们驱动手臂“骨骼”时,手臂部分的顶点也会随之移动,从而简化了动画制作中对“顶点”运动的控制,从而控制“骨骼”的运动。

一个顶点的蒙皮信息包括该顶点受哪些骨骼影响(可以有多个),以及每个骨骼的权重,这样在一些复杂的运动过程中,顶点会更细腻地跟随变化的轨迹现实地,同时消除了关节处的一些撕裂。

图片.png

Unity 中使用 Skinned Mesh Renderer 来实现这种效果。

骨骼动画

得到一个蒙皮的人物模型后,我们只需要控制骨骼的运动来带动模型顶点的运动即可。 动画数据实际上记录了每个骨骼在每个关键帧的位置和旋转信息。 同时通过一些算法实现关键帧之间的插值,实现骨骼的平滑移动。 (这部分通常由动画师在专业软件中制作,俗称K动画,即K关键帧)

图片.png

图中是一个动画文件的信息,可以看到每个关键帧中每个骨骼的位置信息。 有了以上准备工作,我们的模型就可以动起来了。

布娃娃

搞清楚了传统的骨骼动画,Ragdoll的原理就很好理解了。 为角色添加布娃娃效果,只需要在模型骨骼上安装碰撞体和合适大小的刚体组件,使骨骼运动由物理模拟(而不是动画)驱动,物理可以实现基于效果的布娃娃系统。

Unity原生布娃娃

Unity原生提供了Ragdoll功能,我们可以右击模型Prefab -> 3D Object -> Ragdoll...

图片.png

只要按照提示将骨骼相应的Transform拖进去即可。 注意骨骼一般以髋关节为准。 角色腰部以下配置完成后,Unity会自动生成各个肢体的碰撞体,然后我们可以手动调整碰撞体的形状。 适合模型

图片.png

这时候,我们再次运行游戏,发现角色可以像布娃娃一样倒塌。

Unity原生布娃娃系统的功能非常简单。 我们可以点击之前配置好碰撞器的骨骼节点进行观察。 可以看出3D角色,肢体骨架只增加了一个RigidBody和Collider进行物理模拟,同时将肢体模拟关节与CharacterJoint连接起来,剩下的交给Unity物理系统进行模拟。

原生布偶系统不足

看了Unity Ragdoll系统,很明显这个系统的功能比较简单,缺点也很大

布娃娃 Mecanim 搅拌机

Ragdoll Mecanim Mixer 插件的出现解决了以上痛点。 对于这些问题,插件已经实现了很好的解决(插件可以在Asset Store购买,是目前Unity最好的Ragdoll插件之一)

官方文档:

该插件主要由两个脚本组成

布娃娃构造器

该脚本主要用于为角色配置布偶碰撞体及相关信息。 安装脚本后,我们首先需要选择要为哪些骨骼创建碰撞体。 规则和Unity原生的Ragdoll基本一致。 选择后,我们可以手动创建一个Ragdoll Avatar(Scriptable Object)来保存配置信息(选择已有的配置,避免每次重复设置)

图片.png

之后我们可以为每块骨骼设置碰撞体大小、质量、关节活动范围等配置。

[图片上传失败...(image-88e4e9-83)]

配置好Create之后,我们可以在player外面看到一个容器,这里Ragdoll作为一个单独的对象进行管理,与角色本身解耦

图片.png

拉美罐搅拌机

Ragdoll创建完成后,我们可以看到播放器中自动添加了一个RamecanMixer组件。 该组件主要负责控制各种状态切换和动画融合功能。 它可以配置每个骨骼的详细参数。 可以参考官方文档,更容易理解

图片.png

配置完成后,我们可以添加一个新的状态保存,然后使用脚本控制切换 RamecanMixer.BeginStateTransition(Name)

RamecanMixer原理分析

RamecanMixer插件可以实现布娃娃和骨骼分离、动画融合等效果。 它的物理模拟还是基于Unity物理引擎,主要是因为它新的融合算法,不难理解

在Bone.cs中,我们可以看到Ragdoll骨骼的详细定义,可以注意到其中两个参数

显然,Ragdoll骨架记录的是当前动画驱动的骨骼Transform(即模型骨骼),以及物理驱动的Ragdoll骨骼Transform(Ragdoll对象下的一系列碰撞体)。

在RamecanMixer.cs中可以看到物理效果的实现以及与动画的融合主要遵循以下流程

有兴趣的可以仔细阅读插件的源码,加上注释更容易理解

布娃娃参数配置体验

上面介绍了Ragdoll的实现原理unity 道具模型,但是为了达到更好的模拟效果,还需要对每一个骨骼进行详细的配置,同时要反复耐心调试,才能最终达到想要的效果。 下面是一些重要参数的一些参考,主要是模拟角色死亡效果

质量比

要达到更好的布娃娃效果,最重要的是每块骨头的质量分布。 这里建议以实际人体的质量分布为基准

大腿等四肢指的是单一质量。总体重设置在60-100KG之间比较合理

图片.png

即在设置布偶骨量时,不严格按照人体实际质量分布,而是将实际质量乘以相应的百分比。 这个系数从臀部到底部逐渐减小。 实际测试效果确实比严格按照实际质量分布更直观。

RamecanMixer 参数汇总

Unity实现布娃娃效果还是比较容易的,尤其是在现成插件的基础上。 我们要做的主要工作是详细配置Ragdoll参数,使其达到我们想要的效果。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3